import Module from "./module"
import { forEachValue } from "../utils"

export default class ModuleCollection {
  constructor(options) {
    this.root = null // 最后将数据绑定在 root 上
    // [父 ， 子， 孙]
    this.register([], options) // 生成 栈型结构
  }

  // [a, c]
  getNamespace(path) {
    let current = this.root
    return path.reduce((namespace, key) => {
      current = current.getChild(key) // 用儿子作用当前的值  a: {c: {}}
      // 从根开始查找，如果有 namespaced  拼接
      return namespace + (current.namespaced ? key + '/' : '')
    }, '') // 结果要个字符串
  }

  register(path, rootModule) {
    let module = new Module(rootModule)
    // {
    //   _raw: rootModule, // 原始内容
    //   _children: {},
    //   state: rootModule.state
    // }
    if (path.length == 0) {
      this.root = module // 直接讲模块定义在根上
    } else {
      // 放孩子 [a, b, c, d, e]  current 就是 name

      let parent = path.slice(0, -1).reduce((memo, current) => memo.getChild(current), this.root) // 返回的是模块  {a: xxx}
      // parent._children[path[path.length-1]] = module
      parent.addChild(path[path.length-1], module)
    }

    if (rootModule.modules) { // 安一层去循环
      forEachValue(rootModule.modules, (module, moduleName) => {
        // path 不变，返回新数组，所以 [a] [b]  不是 [a, b]
        this.register(path.concat(moduleName), module)
      })
    }
  }
}